<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2019/3/12
 * Time: 21:44
 */

namespace app\common\controller;


use think\cache\driver\Redis;

class RedisServer
{
    public static  $storePrefix = "ymc:activity:";//前缀
    private static $host = '127.0.0.1';
    private static $port = '6379';
    private static $timeout = 0;

    public static function getDB()
    {
        $redis = new \Redis();
        $redis->connect(self::$host,self::$port,self::$timeout);

        //redis 密码
       $redis->auth('zZQWE123456');
        return $redis;
    }

    //设置stringkey
    public static function set($key,$val)
    {
        return static::getDB()->set(static::$storePrefix.$key,$val);
    }
    //获取key值
    public static function get($key)
    {
        return static::getDB()->get(static::$storePrefix.$key);
    }

    //删除key
    public static function del($key)
    {
        return static::getDB()->del(static::$storePrefix.$key);
    }

    //添加无序集合
    public static function sAdd($key,$val = [])
    {
        return static::getDB()->sAdd(static::$storePrefix.$key,$val);
    }
    //移除无序集合中的元素
    public static function srem($key,$member)
    {
        return static::getDB()->srem(static::$storePrefix.$key,$member);
    }

    //获取集合基数
    public static function sCard($key)
    {
        return static::getDB()->sCard(static::$storePrefix.$key);
    }

    //判断member是否为集合元素
    public static function sIsMember($key,$member)
    {
        return static::getDB()->sIsMember(static::$storePrefix.$key,$member);
    }

    //返回集合中的所有元素
    public static function smembers($key)
    {
        return static::getDB()->smembers(static::$storePrefix.$key);
    }

    //移除并返回集合中一个随机元素
    public static function sPop($key)
    {
        return static::getDB()->spop(static::$storePrefix.$key);
    }

    //返回集合中的一个随机元素
    public static function sRandMember($key)
    {
        return static::getDB()->sRandMember(static::$storePrefix.$key);
    }

    //将一个或多个值value插入到列表key的表头。
    public static function lPush($key,$val)
    {
        return static::getDB()->lPush(static::$storePrefix.$key,$val);
    }

    //将值value插入到列表key的表头，当且仅当key存在并且是一个列表。
    public static function lPushx($key,$val)
    {
        return static::getDB()->lPushx(static::$storePrefix.$key,$val);
    }

    //将一个或多个值value插入到列表key的表尾。
    public static function rPush($key,$val)
    {
        return static::getDB()->rPush(static::$storePrefix.$key,$val);
    }

    /**
     * 将值value插入到列表key的表尾，当且仅当key存在并且是一个列表。
     * @param $key
     * @param $val
     * @return int
     */
    public static function rPushx($key,$val)
    {
        return static::getDB()->rPushx(static::$storePrefix.$key,$val);
    }

    //移除并返回列表key的头元素。
    public static function LPOP($key,$val)
    {
        return static::getDB()->LPOP(static::$storePrefix.$key,$val);
    }

    //移除并返回列表key的尾元素。
    public static function RPOP($key,$val)
    {
        return static::getDB()->RPOP(static::$storePrefix.$key,$val);
    }

    //返回列表key的长度。
    public static function LLEN($key)
    {
        return static::getDB()->LLEN(static::$storePrefix.$key);
    }

    /**
     * 获取锁
     * @param  String  $key    锁标识
     * @param  Int     $expire 锁过期时间
     * @return Boolean
     */
    public static function lock($key, $expire=5){
        $redis = static::getDB();
        $is_lock = $redis->setnx($key, time()+$expire);

        // 不能获取锁
        if(!$is_lock){
            // 判断锁是否过期
            $lock_time = $redis->get($key);
            // 锁已过期，删除锁，重新获取
            if(time()>$lock_time){
                static::unlock($key);
                $is_lock = $redis->setnx($key, time()+$expire);
            }
        }
        return $is_lock? true : false;
    }

    /**
     * 释放锁
     * @param  String  $key 锁标识
     * @return Boolean
     */
    public static function unlock($key){
        return static::getDB()->del($key);
    }
  
    //清空数据
    public static function flushDB()
    {
        return static::getDB()->flushDB();
    }

}